原本今天想開始練習情感分析,讀了很多相關文章和snownlp庫
覺得情感分析原理好像和文章分類方法類似,首先要有標註正面和負面的語料庫,才可以開始進行
情感語料庫覺得中文滿不好找的,snownlp中有內建分辨pos,neg的語料庫
snownlp說明有提到這份語料庫是蒐集購物評論,所以當出現"很貴","實用"等單字就看得出效果
不過我測試一些簡單句子"小明很沮喪"就幾乎沒辨識力了
所以關鍵還是在語料庫
於是我又回來繼續調整昨天的模型
看利用其他學過的方法是否能再提高精確度
>>> print(lab_Ftwowords['科技'])
['日綜合外電',
'外電報導',
'臉書',
'iPadPro',
'iPhoneXS',
'搭載',
'朱則瑋',
'則瑋台北',
'新款iPad',
'比特幣',
'蘋果公司',
'XSMax',
'科技網站',
'報導蘋果',
'MacBookAir',
'創新',
>>> print(lab_Ftwowords['產經'])
['億美元',
'新台幣',
'億元',
'福建晉華',
'洗錢防制',
'商業機密',
'兌美元',
'金融機構',
'中華電信',
'新南向',
'公升元',
'外電報導',
'中貿易戰',
'台幣兌',
'美光商業',
'防制洗錢',
'限制競爭',
再把這些類別高頻字整理在一起,由於要拿來做特徵提取,所以這動作不能有標籤
All_Ftwowords=[]
for n in lab_Ftwowords.values():
for m in n:
All_Ftwowords.append(m)
>>> print(All_Ftwowords)
['新台幣',
'李明彥',
'賴香伶',
'陳慶男',
'台幣元',
'法律扶助',
'新聞稿',
'台幣萬元',
'陳姓樁',
'姓樁腳',
'請羈押禁',
'億元',
'台北地檢署',
'南投縣',
最後在特徵提取器中也增加找出雙連字的動作,並且判斷是否出現在剛做出來的All_Ftwowords中做為特徵
def pos_features(article,top):
features={}
t = ''
seg_list = jieba.cut(article, cut_all=False)
t = ",".join(seg_list)
article_tokens = t.split(',')
article_tokens = [w for w in article_tokens if w.isalpha()]
filt_tokens = list(filter(lambda a: a not in stopwords and a not in filterwords , article_tokens))#and len(a)>1, article_tokens))
###
twowords = list(nltk.bigrams(article_tokens))
two = nltk.FreqDist(twowords).most_common(int(top/2))
Ftwowords = [i[0]+i[1] for i,j in two]
for two in Ftwowords:
features[two] = two in All_Ftwowords
###
toks = [w[0] for w in nltk.FreqDist(filt_tokens).most_common(top)]
# print(toks)
for tok in toks:
# features[tok] = tok in [i[0] for i in lab_fwords[labname]]
features[tok] = True
return features
調整好特徵提取器,在執行一遍程式就能做出新的特徵集,就能拿去練模型了
>>> size = int(len(featuresets)*0.7)
>>> train_set, test_set = featuresets[:size], featuresets[size:]
>>> classifier = nltk.NaiveBayesClassifier.train(train_set)
>>> print(nltk.classify.accuracy(classifier, test_set))
0.7944444444444444
結果精確度比昨天低了5%,我覺得是雙連詞中有類似停止詞的字沒有篩出來,還有高頻字與雙連詞拿來做特徵的比例可能也有影響